home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 51 / Amiga Format CD51 (2000-03-10)(Future Publishing)(GB)[!][issue 2000-04].iso / -in_the_mag- / workbench / term_4.8 / extras / source / gtlayout-source.lha / LTP_FillMenu.c < prev    next >
C/C++ Source or Header  |  1997-07-06  |  2KB  |  122 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1997 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. #include "Assert.h"
  15.  
  16. #ifdef DO_MENUS
  17.  
  18.     /* LTP_FillSub(struct MenuItem *Item):
  19.      *
  20.      *    Fill in the submenu item IDs.
  21.      */
  22.  
  23. VOID
  24. LTP_FillSub(
  25.     ULONG                MenuID,
  26.     ULONG                ItemID,
  27.     struct MenuItem *    Item)
  28. {
  29.     ULONG                Count = 0;
  30.     ItemNode *            Node;
  31.     struct MenuItem *    First = Item;
  32.  
  33.     do
  34.     {
  35.         Node = (ItemNode *)((ULONG)Item - sizeof(struct MinNode));
  36.  
  37.         Node->MenuCode = FULLMENUNUM(MenuID,ItemID,Count);
  38.  
  39.         if(Item->MutualExclude && (Item->Flags & CHECKED))
  40.         {
  41.             struct MenuItem    *    This    = First;
  42.             ULONG                Exclude    = Item->MutualExclude;
  43.             LONG                i;
  44.  
  45.             for(i = 0 ; i < 32 && This ; i++, This = This->NextItem)
  46.             {
  47.                 if(This != Item && (This->Flags & CHECKIT) && (Exclude & (1L << i)))
  48.                     This->Flags &= ~CHECKED;
  49.             }
  50.         }
  51.  
  52.         Count++;
  53.     }
  54.     while(Item = Item->NextItem);
  55. }
  56.  
  57.     /* FillItem(struct MenuItem *Item):
  58.      *
  59.      *    Fill in the menu item IDs.
  60.      */
  61.  
  62. VOID
  63. LTP_FillItem(ULONG MenuID,struct MenuItem *Item)
  64. {
  65.     ULONG             Count = 0;
  66.     ItemNode        *Node;
  67.     struct MenuItem    *First = Item;
  68.  
  69.     do
  70.     {
  71.         Node = (ItemNode *)((ULONG)Item - sizeof(struct MinNode));
  72.  
  73.         Node->MenuCode = FULLMENUNUM(MenuID,Count,NOSUB);
  74.  
  75.         if(Item->SubItem)
  76.             LTP_FillSub(MenuID,Count,Item->SubItem);
  77.  
  78.         if(Item->MutualExclude && (Item->Flags & CHECKED))
  79.         {
  80.             struct MenuItem    *This        = First;
  81.             ULONG             Exclude    = Item->MutualExclude;
  82.             LONG             i;
  83.  
  84.             for(i = 0 ; i < 32 && This ; i++, This = This->NextItem)
  85.             {
  86.                 if(This != Item && (This->Flags & CHECKIT) && (Exclude & (1L << i)))
  87.                     This->Flags &= ~CHECKED;
  88.             }
  89.         }
  90.  
  91.         Count++;
  92.     }
  93.     while(Item = Item->NextItem);
  94. }
  95.  
  96.     /* LTP_FillMenu(struct Menu *Menu):
  97.      *
  98.      *    Fill in the menu IDs.
  99.      */
  100.  
  101. VOID
  102. LTP_FillMenu(struct Menu *Menu)
  103. {
  104.     ULONG         Count = 0;
  105.     MenuNode    *Node;
  106.  
  107.     do
  108.     {
  109.         Node = (MenuNode *)((ULONG)Menu - sizeof(struct MinNode));
  110.  
  111.         Node->MenuCode = FULLMENUNUM(Count,NOITEM,NOSUB);
  112.  
  113.         if(Menu->FirstItem)
  114.             LTP_FillItem(Count,Menu->FirstItem);
  115.  
  116.         Count++;
  117.     }
  118.     while(Menu = Menu->NextMenu);
  119. }
  120.  
  121. #endif    /* DO_MENUS */
  122.